'''导入必要的库：导入 os、time、gpiozero、subprocess 和 datetime 库，用于文件操作、时间处理、GPIO 控制、命令执行和时间戳生成。
创建存储目录：使用 os.makedirs 确保 D:\Desktop\fruit_AI\camera_photo 目录存在。
初始化按键：使用 gpiozero.Button 初始化按键，假设按键连接到 GPIO 24。
定义按键按下事件处理函数：on_button_pressed 函数在按键按下时被调用，生成带时间戳的文件名，调用 libcamera-jpeg 命令进行拍照，
并处理可能的错误。
绑定事件：使用 button.when_pressed 将 on_button_pressed 函数绑定到按键按下事件。
主循环：程序进入无限循环，等待按键按下，按 Ctrl + C 可终止程序。
清理资源：程序终止时，关闭按键资源。'''
import os
import time
from gpiozero import Button
import subprocess
from datetime import datetime

# 存储照片的目录
save_dir = "D:/Desktop/fruit_AI/camera_photo"

# 初始化按键，假设按键连接到 GPIO 24
button = Button(24)

# 去抖动延迟时间
DEBOUNCE_DELAY = 0.2
last_press_time = 0

def on_button_pressed():
    global last_press_time
    current_time = time.time()
    # 检查是否在去抖动时间内
    if current_time - last_press_time > DEBOUNCE_DELAY:
        print("按键被按下，开始拍照...")
        # 生成带时间戳的文件名
        timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
        image_path = os.path.join(save_dir, f"captured_image_{timestamp}.jpg")

        try:
            # 调用 libcamera-jpeg 命令进行拍照
            subprocess.run(
                ["libcamera-jpeg", "-o", image_path, "--nopreview"],
                check=True,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )
            print(f"图片已保存到 {image_path}")
        except subprocess.CalledProcessError as e:
            print(f"拍照失败: {e.stderr.decode('utf-8')}")

        last_press_time = current_time

# 绑定按键按下事件
button.when_pressed = on_button_pressed

try:
    print("等待按键按下...")
    while True:
        time.sleep(0.01)  # 减少 CPU 占用
except KeyboardInterrupt:
    print("程序终止")
finally:
    button.close()
